package com.netflix.schlep.eventbus;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Lists;
import com.google.common.io.Closeables;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
import com.google.inject.Scopes;
import com.google.inject.servlet.GuiceFilter;
import com.google.inject.servlet.GuiceServletContextListener;
import com.netflix.governator.guice.LifecycleInjector;
import com.netflix.governator.lifecycle.LifecycleManager;
import com.netflix.schlep.eventbus.jersey.BridgeAdminResource;
import com.netflix.schlep.eventbus.jersey.JsonMessageBodyReader;
import com.netflix.schlep.eventbus.jersey.JsonMessageBodyWriter;
import com.netflix.schlep.guice.SchlepModule;
import com.netflix.schlep.sim.SimSchlepModule;
import com.sun.jersey.guice.JerseyServletModule;
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
public class JettyRunner {
private static final Logger LOG = LoggerFactory.getLogger(JettyRunner.class);
public static void main(String[] args) throws Exception {
final List<AbstractModule> modules = Lists.newArrayList(
new SimSchlepModule(),
new SchlepModule(),
new EventBusModule(),
new AbstractModule() {
@Override
protected void configure() {
}
},
new JerseyServletModule() {
@Override
protected void configureServlets() {
LOG.info("Binding jersey servlets");
bind(BridgeAdminResource.class).asEagerSingleton();
bind(JsonMessageBodyReader.class).asEagerSingleton();
bind(JsonMessageBodyWriter.class).asEagerSingleton();
// Route all requests through GuiceContainer
bind(GuiceContainer.class).asEagerSingleton();
serve("/*").with(GuiceContainer.class);
}
}
);
LOG.info("Starting application");
// Create the server.
Server server = new Server(8080);
ServletContextHandler sch = new ServletContextHandler(server, "/");
final Injector injector = LifecycleInjector.builder()
.withModules(modules)
.createInjector();
// Add our Guice listener that includes our bindings
sch.addEventListener(new GuiceServletContextListener() {
@Override
protected Injector getInjector() {
return injector;
}
});
sch.addFilter(GuiceFilter.class, "/*", null);
sch.addServlet(DefaultServlet.class, "/");
LifecycleManager manager = injector.getInstance(LifecycleManager.class);
try {
manager.start();
// Start the server
server.start();
server.join();
}
finally {
LOG.info("Stopping application");
Closeables.close(manager, true);
}
}
}